# 计算机中的每个文件也有唯一确定的标识
# 文件标识分为路径、文件名主干和扩展名三个部分
# 计算机中的文件分为文本文件和二进制文件
# 1.文件的打开与关闭
# ①打开文件
# 语法：open(file,mode='r',encoding=None)
# file:文件名  encoding:编码格式   mode:打开模式(r,w,a)
# r:只读(默认)  w:只写  a:追加  +:更新  b:以二进制形式打开
# r/rb  只读模式    以只读方式打开，若文件不存在，则打开失败
# w/wb  只写模式    以只写方式打开，若文件已存在，则重写文件，若不存在，则新建文件
# a/ab  追加模式    以追加形式打开，只允许在文件末尾追加数据，若不存在，则新建文件
# r+/rb+ 读取模式   以读/写方式打开文件,若文件不存在，打开失败
# w+/wb+ 写入模式   以读/写方式打开文件,若文件已存在，则重写文件
# a+/ab+ 追加模式   以读/写方式打开文件,只允许在文件末尾追加数据，若不存在，则新建文件
# 若open() 函数调用成功，则返回一个文件对象
file1 = open("test.txt", encoding="utf-8")
# 目标文件与当前文件在同一个文件夹中可使用相对路径
print(file1.read())
# ②.关闭文件
# close()方法
file1.close()
# with语句(常用)
# with语句预定义清理操作,实现文件的自动关闭
with open("test.txt") as f:
    pass
# as后的变量f用于接收with语句打开的文件对象 pass空语句时的一个占位符,使程序不报错

# 2.文件的读写
# ①读取文件
# read()方法  从指定文件中读取指定字节的数据
# 语法:read(n)   n用于设置读取数据字节数,默认为-1 一次读取并返回全部数据
with open("test.txt", mode="r", encoding="utf-8") as f1:
    print(f1.read(2))  # 读取两个字节长度
    print(f1.read(2))  # 接着上次读取的位置再读取两个字节长度
    print(f1.read())  # 剩余数据全部读取并返回
# readline()方法
# 从指定文件中读取一行数据
with open("test.txt", mode="r", encoding="utf-8") as f2:
    print(f2.readline())  # 读取一行数据
    print(f2.readline())  # 接着上次读取的地方再读取一行数据
# readiness()方法
# 一次性读取文件中的所有数据,若读取成功返回一个列表,一行对应列表中的一个元素
with open("test.txt", mode="r", encoding="utf-8") as f3:
    print(f3.readlines())  # ['哈哈abcdsjffffsnvj\n', '嘿嘿 sjns s']
# ②写文件
# write()方法     将指定字符串写入文件
# 语法:write(data)    写入成功返回本次写入文件的数据字节数
string = 'write()方法     将指定字符串写入文件'
with open("test.txt", mode='w', encoding="utf-8") as f4:
    print(f4.write(string))  # w 写模式会重写文件内容即覆盖原内容
# writelines()方法    将行列表写入文件
# 语法:writelines(lines)
# lines:字符串/字符串列表 若需要换行,应显式指定换行符\n  \:续行符
string = '# writelines()方法    将行列表写入文件 \n' \
         '语法:writelines(lines)  lines:字符串/字符串列表 若需要换行,应显式指定换行符'
with open("test.txt", mode='w', encoding="utf-8") as f5:
    print(f5.write(string))  # w 写模式会重写文件内容即覆盖原内容

# 3.文件的定位读写
# tell()方法   用于获取文件当前读写位置
with open('test.txt', mode='r', encoding='utf-8') as f6:
    print(f6.tell())  # 0
    print(f6.read(5))
    print(f6.tell())  # 5
# seek()方法   控制文件的读写位置
# 语法：seek(offset,from)   
# offset表示偏移量,即读写位置需要移动的字节数;from用于指定文件的读写位置取值为(0,1,2)
# 0：表示文件开头  1：表示使用当前读写位置    2：表示文件末尾
# seek()方法调用成功后会返回当前读写的位置
with open("test.txt", mode="r", encoding="utf-8") as f7:
    print(f7.read(2))
    print(f7.tell())
    print(f7.seek(5, 0))  # 相对于文件首部移动5个字节  返回当前读写位置
    print(f7.read(2))
